/*!
 * Custom axios instance
 * axios: https://www.npmjs.com/package/axios
 * version: 0.0.1,
 * author: play,
 * Copyright 2019-09-29 tcsoft
 */

import Vue from "vue";
import axios from "axios";
import { errorHandle } from "./index";
import store from "@/store";
import router from "@/router";
import { Notify } from "vant";

import { ACCESS_TOKEN, ACCESS_TOKEN_TYPE } from "@/store/mutation-types";

// 创建 axios 实例
const instance = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL,
  timeout: 3000, // 请求的超时时间
  // headers: {
  //   "Content-Type": "application/json;charset=UTF-8"
  // },
  withCredentials: true // 允许携带cookie
});

// 添加请求拦截器
instance.interceptors.request.use(
  config => {
    // 登录流程控制中，根据本地是否存在token判断用户的登录情况
    // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
    // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
    let token = Vue.ls.get(ACCESS_TOKEN);
    token && (config.headers["CLIENT-TOKEN"] = `${token}`);
    return config;
  },
  error => Promise.error(error)
);

// 添加响应拦截器
instance.interceptors.response.use(
  // 请求成功
  res => {
    if (res.status !== 200) {
      errorHandle(res);
    } else {
      let code = parseInt(res.data.code);
      switch (code) {
        case 401:
          store.dispatch("Logout").then(() => {
            router.push("/login");
          });
          break;
        case 402:
          store.dispatch("refreshToken");
          break;
        default:
          break;
      }
    }

    return Promise.resolve(res.data);
  },
  // res.status === 200 ? Promise.resolve(res.data) : Promise.reject(res),
  // 请求失败
  err => {
    errorHandle(err);
    return Promise.reject(err);
  }
);

export default instance;
